package cn.itsource.basic.service.impl;

import cn.itsource.basic.constant.VerificationConstant;
import cn.itsource.basic.exception.CustomException;
import cn.itsource.basic.service.IVerificationCodeService;
import cn.itsource.basic.utils.SendMsgUtils;
import cn.itsource.basic.utils.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Service
public class VerificationCodeServiceImpl implements IVerificationCodeService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 发送注册验证码
     * 验证码需求：
     *      1.后台随机产生4个字符
     *      2.1分钟以内只能发送1次验证码
     *      3.超过1分钟，但在5分钟以内，发送的验证码依然是第一次产生的验证码字符
     *      4.超过了5分钟以后，产生全新的验证码
     * @return
     */
    @Override
    public void sendRegisterVerificationCode(String phone) throws CustomException {
        //用户注册验证码
        sendVerificationCode(phone,phone+":"+VerificationConstant.USER_REG);
    }

    @Override
    public void sendBinderVerificationCode(String phone) throws CustomException {
        //手机和微信绑定验证码
        sendVerificationCode(phone,phone+":"+VerificationConstant.USER_BINDER);
    }

    private void sendVerificationCode(String phone,String key) throws CustomException {
        //随机产生4个字符
        String value = StrUtils.getComplexRandomString(4);
        //在redis中通过key获取对应的值        value:时间戳
        String valueCode = (String) redisTemplate.opsForValue().get(key);
        //如果不为空，就意味着验证码没有过期，依然是在5分钟以内
        if(!StringUtils.isEmpty(valueCode)){
            //开始时间戳
            String beginTimer = valueCode.split(":")[1];

            if(System.currentTimeMillis()-Long.valueOf(beginTimer)<=60*1000){
                throw new CustomException("亲！一分钟以内不能发送多次验证码!!");
            }
            //证明是超过了1分钟，但依然在5分钟以内，还是用之前的验证码
            value = valueCode.split(":")[0];
        }
        //存储redis中，设置有效期是5分钟  k=phone:USER_REG  v= value:时间戳
//        RedisUtil.set(phone:USER_REG,  value:System.currentTimeMillis(),  5MIN);
        redisTemplate.opsForValue().set(key,
                value + ":" + System.currentTimeMillis(), 5, TimeUnit.MINUTES);
        //发送手机验证码
        String context = "尊敬的用户，您的验证码为:" + value + ",请您在5分钟以内完成注册!!";
        //发送短信
        System.out.println(context);
    }
}
